package com.can.lambda;


public class TestLambda_02 {

    //静态内部类
    static class Love2 implements ILove{
        @Override
        public void love(int a) {
            System.out.println("i love you2-->"+a);
        }
    }

    public static void main(String[] args) {
        ILove love = new Love();
        love.love(1);

        love = new Love2();
        love.love(2);

        //局部内部类
        class Love2 implements ILove{
            @Override
            public void love(int a) {
                System.out.println("i love you3-->"+a);
            }
        }
        love = new Love2();
        love.love(3);

        //匿名内部类
        ILove love2 = new ILove() {
            @Override
            public void love(int a) {
                System.out.println("i love you4-->"+a);
            }
        };
        love2.love(4);

        //Lambda表达式
        ILove love3 = (int a) ->{
            System.out.println("i love you5-->"+a);
        };
        love3.love(5);

        //Lambda表达式 简化1，去掉参数类型
        love3 = (a) ->{
            System.out.println("i love you6-->"+a);
        };

        //Lambda表达式 简化2，去掉括号
        love3 = a -> {
            System.out.println("i love you6-->" + a);
            System.out.println("i love you-->too"+a);
        };
        love3.love(6);

        //Lambda表达式 简化2，去掉花括号  代表只有一行的时候可以，如果有多行 就不能去掉花括号
        love3 = a ->
                System.out.println("i love you7-->"+a);//不行System.out.println("i love you-->too"+a);
        love3.love(7);

        //总结:Lambda表达式只能有一行代码的情况下才能简化成一行，如果有多行，那么就用代码块(6号参数参考)包裹
        //前提是接口为 函数式接口(接口只有一个方法就是函数式接口)
        //多个参数也可以去掉参数类型，要去掉就都去掉,多个参数去掉类型必须加括号
    }

}

//函数式接口
interface ILove{
    void love(int a);
}

//实现类
class Love implements ILove{

    @Override
    public void love(int a) {
        System.out.println("i love you1-->"+a);
    }
}